/*
 * Configuracion.cpp
 *
 *  Created on: 10/09/2010
 *      Author: julfc, luciano.lattes
 */

#include "Configuracion.h"

const std::string Configuracion::PATH_ARCHIVO_CFG = "agBrown.cfg";

Configuracion::Configuracion() {

  archivoConfiguracion.open(PATH_ARCHIVO_CFG.c_str(), std::fstream::in | std::fstream::out);

  if (!archivoConfiguracion.is_open()) {
    archivoConfiguracion.clear();

    archivoConfiguracion.open(PATH_ARCHIVO_CFG.c_str(), std::fstream::out);
    archivoConfiguracion.close();

    archivoConfiguracion.open(PATH_ARCHIVO_CFG.c_str(), std::fstream::in | std::fstream::out);

    if (!archivoConfiguracion.is_open())
      throw std::ios_base::failure("El archivo no pudo ser abierto.");
  }
}

void Configuracion::escribirValor(const std::string& cadena) {
  archivoConfiguracion << cadena;

  if (archivoConfiguracion.fail())
    throw std::ios_base::failure("No se pudo escribir correctamente la cadena.");

  archivoConfiguracion << std::endl;

  if (archivoConfiguracion.fail())
    throw std::ios_base::failure("No se pudo terminar la linea.");
}

bool Configuracion::leerLinea(std::string &cadena) {
  char linea[MAX_LENGTH];

  archivoConfiguracion.getline((char*) &linea, MAX_LENGTH, '\n');
  cadena = linea;

  if (archivoConfiguracion.fail()) {
    archivoConfiguracion.clear();
    return false;
  }
  return true;
}

void Configuracion::crearPropiedad(const std::string& clave,
    const std::string& valor) {
  std::string composicion;
  composicion.append(clave);
  composicion.append("=");
  composicion.append(valor);
  escribirValor(composicion);
}

std::string Configuracion::retornarValor(const std::string& clave) {
  std::string linea;
  std::string valor;
  irAlPrincipio();

  while (leerLinea(linea)) {
    std::string claveActual;
    claveActual.append(linea.substr(0, linea.find_first_of("=", 0)));
    if (claveActual.compare(clave) == 0) {
      valor.append(linea.substr((linea.find_first_of("=", 0) + 1),
          linea.size()));
      break;
    }
  }
  return valor;
}

std::vector<std::string> Configuracion::retornarGrupoClaves(
    const std::string &cadena) {
  std::vector<std::string> resultado;
  std::string linea;
  std::string clave;

  irAlPrincipio();

  while (leerLinea(linea)) {
    if (linea.find(cadena) != -1) {
      clave = linea.substr(0, linea.find_first_of("=", 0));
      resultado.push_back(clave);
    }
  }
  return resultado;
}

bool Configuracion::retornarClave(std::string &cadena) {
  std::string linea;
  if (leerLinea(linea)) {
    cadena = linea.substr(0, linea.find_first_of("=", 0));
    return true;
  }
  return false;
}

void Configuracion::eliminarEntrada(const std::string& clave) {
	std::vector<std::string> fileVector;
	std::string temp;

	irAlPrincipio();

	while (leerLinea(temp)) {
		std::string lineaEliminar = temp.substr(0, temp.find_first_of("=", 0));

		if (lineaEliminar.compare(clave) != 0) {
			fileVector.push_back(temp);
		}
	}

	archivoConfiguracion.close();

	archivoConfiguracion.open(PATH_ARCHIVO_CFG.c_str(), std::fstream::out | std::fstream::trunc);

	for(std::vector<std::string>::const_iterator i = fileVector.begin(); i != fileVector.end(); ++i) {
		archivoConfiguracion << *i << std::endl;
	}

	archivoConfiguracion.close();

	archivoConfiguracion.open(PATH_ARCHIVO_CFG.c_str(), std::fstream::in | std::fstream::out);

}

void Configuracion::limpiarConf(const std::string& desde) {
	std::vector<std::string> fileVector;
	std::string temp;

	irAlPrincipio();

	while (leerLinea(temp)) {
		std::string lineaEliminar = temp.substr(0, temp.find_first_of("=", 0));

		if (lineaEliminar.compare(desde) != 0) {
			fileVector.push_back(temp);
		} else if (lineaEliminar.compare(desde) == 0) {
			fileVector.push_back(temp);
			break;
		}
	}

	archivoConfiguracion.close();

	archivoConfiguracion.open(PATH_ARCHIVO_CFG.c_str(), std::fstream::out | std::fstream::trunc);

	for(std::vector<std::string>::const_iterator i = fileVector.begin(); i != fileVector.end(); ++i) {
		archivoConfiguracion << *i << std::endl;
	}

	archivoConfiguracion.close();

	archivoConfiguracion.open(PATH_ARCHIVO_CFG.c_str(), std::fstream::in | std::fstream::out);
}

/*void Configuracion::eliminarEntrada(const std::string& clave1,
		  const std::string& clave2, const std::string& clave3) {

	std::vector<std::string> fileVector;
	std::string temp;

	irAlPrincipio();

	while (leerLinea(temp)) {
		std::string lineaEliminar = temp.substr(0, temp.find_first_of("=", 0));

		if (lineaEliminar.find(clave1) > 0 && lineaEliminar.find(clave2) > 0
				&& lineaEliminar.find(clave3) > 0) {
			fileVector.push_back(temp);
		}
	}

	archivoConfiguracion.close();

	archivoConfiguracion.open(PATH_ARCHIVO_CFG.c_str(), std::fstream::out | std::fstream::trunc);

	for(std::vector<std::string>::const_iterator i = fileVector.begin(); i != fileVector.end(); ++i) {
		archivoConfiguracion << *i << std::endl;
	}

	archivoConfiguracion.close();

	archivoConfiguracion.open(PATH_ARCHIVO_CFG.c_str(), std::fstream::in | std::fstream::out);
} */

void Configuracion::irAlPrincipio() {
  archivoConfiguracion.tellg();
  archivoConfiguracion.clear();
  archivoConfiguracion.seekg(0);
  archivoConfiguracion.seekp(0);
  archivoConfiguracion.tellg();
}

void Configuracion::irAlFinal() {
  archivoConfiguracion.tellg();
  archivoConfiguracion.clear();
  archivoConfiguracion.seekg(0, std::ios::end);
  archivoConfiguracion.seekp(0, std::ios::end);
  archivoConfiguracion.tellg();
}

Configuracion::~Configuracion() {
  archivoConfiguracion.close();
}
